package com.hei.kml.schame;

import com.hei.kml.converter.JSONConverter;
import com.hei.kml.converter.KMLConverter;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import lombok.Data;

import java.util.List;

/**
 * <p><code>template.kml</code>示例文件如下（以航点飞行模板为例）：</p>
 * <pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 * &lt;kml xmlns=&quot;http://www.opengis.net/kml/2.2&quot; xmlns:wpml=&quot;http://www.dji.com/wpmz/1.0.2&quot;&gt;
 * &lt;Document&gt;
 *
 *   &lt;!-- Step 1: Implement File Creation Information --&gt;
 *   &lt;wpml:author&gt;Name&lt;/wpml:author&gt;
 *   &lt;wpml:createTime&gt;1637600807044&lt;/wpml:createTime&gt;
 *   &lt;wpml:updateTime&gt;1637600875837&lt;/wpml:updateTime&gt;
 *
 *   &lt;!-- Step 2: Setup Mission Configuration --&gt;
 *   &lt;wpml:missionConfig&gt;
 *     &lt;wpml:flyToWaylineMode&gt;safely&lt;/wpml:flyToWaylineMode&gt;
 *     &lt;wpml:finishAction&gt;goHome&lt;/wpml:finishAction&gt;
 *     &lt;wpml:exitOnRCLost&gt;goContinue&lt;/wpml:exitOnRCLost&gt;
 *     &lt;wpml:executeRCLostAction&gt;hover&lt;/wpml:executeRCLostAction&gt;
 *     &lt;wpml:takeOffSecurityHeight&gt;20&lt;/wpml:takeOffSecurityHeight&gt;
 *     &lt;wpml:takeOffRefPoint&gt;23.98057,115.987663,100&lt;/wpml:takeOffRefPoint&gt;
 *     &lt;wpml:takeOffRefPointAGLHeight&gt;35&lt;/wpml:takeOffRefPointAGLHeight&gt;
 *     &lt;wpml:globalTransitionalSpeed&gt;8&lt;/wpml:globalTransitionalSpeed&gt;
 *     &lt;wpml:droneInfo&gt;
 *       &lt;!-- Declare drone model with M30 --&gt;
 *       &lt;wpml:droneEnumValue&gt;67&lt;/wpml:droneEnumValue&gt;
 *       &lt;wpml:droneSubEnumValue&gt;0&lt;/wpml:droneSubEnumValue&gt;
 *     &lt;/wpml:droneInfo&gt;
 *     &lt;wpml:payloadInfo&gt;
 *       &lt;!-- Declare payload model with M30 --&gt;
 *       &lt;wpml:payloadEnumValue&gt;52&lt;/wpml:payloadEnumValue&gt;
 *       &lt;wpml:payloadPositionIndex&gt;0&lt;/wpml:payloadPositionIndex&gt;
 *     &lt;/wpml:payloadInfo&gt;
 *   &lt;/wpml:missionConfig&gt;
 *
 *   &lt;!-- Step 3: Setup A Folder for Waypoint Template --&gt;
 *   &lt;Folder&gt;
 *     &lt;wpml:templateType&gt;waypoint&lt;/wpml:templateType&gt;
 *     &lt;wpml:useGlobalTransitionalSpeed&gt;0&lt;/wpml:useGlobalTransitionalSpeed&gt;
 *     &lt;wpml:templateId&gt;0&lt;/wpml:templateId&gt;
 *     &lt;wpml:waylineCoordinateSysParam&gt;
 *       &lt;wpml:coordinateMode&gt;WGS84&lt;/wpml:coordinateMode&gt;
 *       &lt;wpml:heightMode&gt;EGM96&lt;/wpml:heightMode&gt;
 *       &lt;wpml:globalShootHeight&gt;50&lt;/wpml:globalShootHeight&gt;
 *       &lt;wpml:positioningType&gt;GPS&lt;/wpml:positioningType&gt;
 *       &lt;wpml:surfaceFollowModeEnable&gt;1&lt;/wpml:surfaceFollowModeEnable&gt;
 *       &lt;wpml:surfaceRelativeHeight&gt;100&lt;/wpml:surfaceRelativeHeight&gt;
 *     &lt;/wpml:waylineCoordinateSysParam&gt;
 *     &lt;wpml:autoFlightSpeed&gt;7&lt;/wpml:autoFlightSpeed&gt;
 *     &lt;wpml:gimbalPitchMode&gt;usePointSetting&lt;/wpml:gimbalPitchMode&gt;
 *     &lt;wpml:globalWaypointHeadingParam&gt;
 *       &lt;wpml:waypointHeadingMode&gt;followWayline&lt;/wpml:waypointHeadingMode&gt;
 *       &lt;wpml:waypointHeadingAngle&gt;45&lt;/wpml:waypointHeadingAngle&gt;
 *       &lt;wpml:waypointPoiPoint&gt;24.323345,116.324532,31.000000&lt;/wpml:waypointPoiPoint&gt;
 *       &lt;wpml:waypointHeadingPathMode&gt;clockwise&lt;/wpml:waypointHeadingPathMode&gt;
 *     &lt;/wpml:globalWaypointHeadingParam&gt;
 *     &lt;wpml:globalWaypointTurnMode&gt;toPointAndStopWithDiscontinuityCurvature&lt;/wpml:globalWaypointTurnMode&gt;
 *     &lt;wpml:globalUseStraightLine&gt;0&lt;/wpml:globalUseStraightLine&gt;
 *     &lt;Placemark&gt;
 *       &lt;Point&gt;
 *         &lt;!-- Fill longitude and latitude here --&gt;
 *         &lt;coordinates&gt;
 *           longitude,latitude
 *         &lt;/coordinates&gt;
 *       &lt;/Point&gt;
 *       &lt;wpml:index&gt;0&lt;/wpml:index&gt;
 *       &lt;wpml:ellipsoidHeight&gt;90.2&lt;/wpml:ellipsoidHeight&gt;
 *       &lt;wpml:height&gt;100&lt;/wpml:height&gt;
 *       &lt;wpml:useGlobalHeight&gt;1&lt;/wpml:useGlobalHeight&gt;
 *       &lt;wpml:useGlobalSpeed&gt;1&lt;/wpml:useGlobalSpeed&gt;
 *       &lt;wpml:useGlobalHeadingParam&gt;1&lt;/wpml:useGlobalHeadingParam&gt;
 *       &lt;wpml:useGlobalTurnParam&gt;1&lt;/wpml:useGlobalTurnParam&gt;
 *       &lt;wpml:gimbalPitchAngle&gt;0&lt;/wpml:gimbalPitchAngle&gt;
 *     &lt;/Placemark&gt;
 *     &lt;Placemark&gt;
 *       &lt;Point&gt;
 *         &lt;!-- Fill longitude and latitude here --&gt;
 *         &lt;coordinates&gt;
 *           longitude,latitude
 *         &lt;/coordinates&gt;
 *       &lt;/Point&gt;
 *       &lt;wpml:index&gt;1&lt;/wpml:index&gt;
 *       &lt;wpml:ellipsoidHeight&gt;90.2&lt;/wpml:ellipsoidHeight&gt;
 *       &lt;wpml:height&gt;100&lt;/wpml:height&gt;
 *       &lt;wpml:useGlobalHeight&gt;1&lt;/wpml:useGlobalHeight&gt;
 *       &lt;wpml:useGlobalSpeed&gt;1&lt;/wpml:useGlobalSpeed&gt;
 *       &lt;wpml:useGlobalHeadingParam&gt;1&lt;/wpml:useGlobalHeadingParam&gt;
 *       &lt;wpml:useGlobalTurnParam&gt;1&lt;/wpml:useGlobalTurnParam&gt;
 *       &lt;wpml:gimbalPitchAngle&gt;0&lt;/wpml:gimbalPitchAngle&gt;
 *       &lt;!-- Declare action group for waypoint 1# --&gt;
 *       &lt;wpml:actionGroup&gt;
 *         &lt;wpml:actionGroupId&gt;0&lt;/wpml:actionGroupId&gt;
 *         &lt;wpml:actionGroupStartIndex&gt;1&lt;/wpml:actionGroupStartIndex&gt;
 *         &lt;wpml:actionGroupEndIndex&gt;1&lt;/wpml:actionGroupEndIndex&gt;
 *         &lt;wpml:actionGroupMode&gt;sequence&lt;/wpml:actionGroupMode&gt;
 *         &lt;wpml:actionTrigger&gt;
 *           &lt;wpml:actionTriggerType&gt;reachPoint&lt;/wpml:actionTriggerType&gt;
 *         &lt;/wpml:actionTrigger&gt;
 *         &lt;!-- Declare the 1st action: rotate gimbal --&gt;
 *         &lt;wpml:action&gt;
 *           &lt;wpml:actionId&gt;0&lt;/wpml:actionId&gt;
 *           &lt;wpml:actionActuatorFunc&gt;gimbalRotate&lt;/wpml:actionActuatorFunc&gt;
 *           &lt;wpml:actionActuatorFuncParam&gt;
 *             &lt;wpml:gimbalRotateMode&gt;absoluteAngle&lt;/wpml:gimbalRotateMode&gt;
 *             &lt;wpml:gimbalPitchRotateEnable&gt;0&lt;/wpml:gimbalPitchRotateEnable&gt;
 *             &lt;wpml:gimbalPitchRotateAngle&gt;0&lt;/wpml:gimbalPitchRotateAngle&gt;
 *             &lt;wpml:gimbalRollRotateEnable&gt;0&lt;/wpml:gimbalRollRotateEnable&gt;
 *             &lt;wpml:gimbalRollRotateAngle&gt;0&lt;/wpml:gimbalRollRotateAngle&gt;
 *             &lt;wpml:gimbalYawRotateEnable&gt;1&lt;/wpml:gimbalYawRotateEnable&gt;
 *             &lt;wpml:gimbalYawRotateAngle&gt;30&lt;/wpml:gimbalYawRotateAngle&gt;
 *             &lt;wpml:gimbalRotateTimeEnable&gt;0&lt;/wpml:gimbalRotateTimeEnable&gt;
 *             &lt;wpml:gimbalRotateTime&gt;0&lt;/wpml:gimbalRotateTime&gt;
 *             &lt;wpml:payloadPositionIndex&gt;0&lt;/wpml:payloadPositionIndex&gt;
 *           &lt;/wpml:actionActuatorFuncParam&gt;
 *         &lt;/wpml:action&gt;
 *         &lt;!-- Declare the 2nd action: take photo --&gt;
 *         &lt;wpml:action&gt;
 *           &lt;wpml:actionId&gt;1&lt;/wpml:actionId&gt;
 *           &lt;wpml:actionActuatorFunc&gt;takePhoto&lt;/wpml:actionActuatorFunc&gt;
 *           &lt;wpml:actionActuatorFuncParam&gt;
 *             &lt;wpml:fileSuffix&gt;point1&lt;/wpml:fileSuffix&gt;
 *             &lt;wpml:payloadPositionIndex&gt;0&lt;/wpml:payloadPositionIndex&gt;
 *           &lt;/wpml:actionActuatorFuncParam&gt;
 *         &lt;/wpml:action&gt;
 *       &lt;/wpml:actionGroup&gt;
 *     &lt;/Placemark&gt;
 *   &lt;/Folder&gt;
 * &lt;/Document&gt;
 * &lt;/kml&gt;
 * </code></pre>
 * <h2>元素说明</h2>
 * <h3>创建信息（父元素：<code>&lt;Document&gt;</code>）</h3>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:author</td>
 * <td>文件创建作者</td>
 * <td>字符串</td>
 * <td>-</td>
 * <td>-</td>
 * <td>无，非必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:createTime</td>
 * <td>文件创建时间（Unix Timestamp）</td>
 * <td>整型</td>
 * <td>ms</td>
 * <td>-</td>
 * <td>无，非必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:updateTime</td>
 * <td>文件更新时间（Unix Timestamp）</td>
 * <td>整型</td>
 * <td>ms</td>
 * <td>-</td>
 * <td>无，非必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h3>任务信息（父元素：<code>&lt;wpml:missionConfig&gt;</code>）</h3>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位 <div style="width: 50pt"/></th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:flyToWaylineMode</td>
 * <td>飞向首航点模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>safely：安全模式<br/>（M300）飞行器起飞，上升至首航点高度，再平飞至首航点。如果首航点低于起飞点，则起飞后平飞至首航点上方再下降。<br/>（M30）飞行器起飞，上升至首航点高度，再平飞至首航点。如果首航点低于“安全起飞高度”，则起飞至“安全起飞高度”后，平飞至首航点上方再下降。注意“安全起飞高度”仅在飞行器未起飞时生效。<br/><br/>pointToPoint：倾斜飞行模式<br/>（M300）飞行器起飞后，倾斜飞到首航点。<br/>（M30）飞行器起飞至“安全起飞高度”，再倾斜爬升至首航点。如果首航点高度低于“安全起飞高度”，则先平飞后下降。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:finishAction</td>
 * <td>航线结束动作</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>goHome：飞行器完成航线任务后，退出航线模式并返航。noAction：飞行器完成航线任务后，退出航线模式。<br/>autoLand：飞行器完成航线任务后，退出航线模式并原地降落。<br/>gotoFirstWaypoint：飞行器完成航线任务后，立即飞向航线起始点，到达后退出航线模式。* 注：以上动作执行过程，若飞行器退出了航线模式且进入失控状态，则会优先执行失控动作。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:exitOnRCLost</td>
 * <td>失控是否继续执行航线</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>goContinue：继续执行航线<br/>executeLostAction：退出航线，执行失控动作</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:executeRCLostAction</td>
 * <td>失控动作类型</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>goBack：返航。飞行器从失控位置飞向起飞点<br/>landing：降落。飞行器从失控位置原地降落<br/>hover：悬停。飞行器从失控位置悬停</td>
 * <td>无，当wpml:exitOnRCLost为executeLostAction时为必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:takeOffSecurityHeight</td>
 * <td>安全起飞高度</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>[2, 1500] （高度模式：相对起飞点高度）<br/> * 注：飞行器起飞后，先爬升至该高度，再根据“飞向首航点模式”的设置飞至首航点。该元素仅在飞行器未起飞时生效。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalTransitionalSpeed</td>
 * <td>全局航线过渡速度</td>
 * <td>浮点型</td>
 * <td>m/s</td>
 * <td>[1,15]<br/>* 注：飞行器飞往每条航线首航点的速度。航线任务中断时，飞行器从当前位置恢复至断点的速度。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalRTHHeight</td>
 * <td>全局返航高度</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>*注：飞行器返航时，先爬升至该高度，再进行返航</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:takeOffRefPoint&lt;x,y,z&gt;</td>
 * <td>参考起飞点</td>
 * <td>浮点型</td>
 * <td>°,  °,  m</td>
 * <td>[-180,180],[-90,90],无限制<br/>* 注：“参考起飞点”仅做航线规划参考，飞行器执行航线时以飞行器真实的起飞点为准，高度使用椭球高。</td>
 * <td>无，非必需元素</td>
 * <td>M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:takeOffRefPointAGLHeight</td>
 * <td>参考起飞点海拔高度</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>* 注：”参考起飞点“海拔高度，与“参考起飞点”中的椭球高度对应。</td>
 * <td>无，非必需元素</td>
 * <td>M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:droneInfo</td>
 * <td>飞行器机型信息</td>
 * <td>-</td>
 * <td>-</td>
 * <td><em>注：请在<a href="https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/dji-wpml/common-element.html">共用元素信息</a>章节阅读详细信息</em></td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:payloadInfo</td>
 * <td>负载机型信息</td>
 * <td>-</td>
 * <td>-</td>
 * <td><em>注：请在<a href="https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/dji-wpml/common-element.html">共用元素信息</a>章节阅读详细信息</em></td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:autoRerouteInfo</td>
 * <td>航线绕行</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h3>模板信息（父元素：<code>&lt;Folder&gt;</code>）</h3>
 * <h4>模板共用的元素（父元素：<code>&lt;Folder&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:templateType</td>
 * <td>预定义模板类型<br/>* 注：模板为用户提供了快速生成航线的方案。用户填充模板元素，再导入大疆支持客户端（如DJI Pilot），即可快速生成可执行的测绘/巡检航线。</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>waypoint：航点飞行<br/>mapping2d：建图航拍<br/> mapping3d：倾斜摄影<br/>mappingStrip：航带飞行</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:templateId</td>
 * <td>模板ID<br/>* 注：在一个kmz文件内该ID唯一。建议从0开始单调连续递增。在template.kml和waylines.wpml文件中，将使用该id将模板与所生成的可执行航线进行关联。</td>
 * <td>整型</td>
 * <td>-</td>
 * <td>[0, 65535]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:autoFlightSpeed</td>
 * <td>全局航线飞行速度</td>
 * <td>浮点型</td>
 * <td>m/s</td>
 * <td>[1,15]<br/>* 注：该元素定义了此模板生成的整段航线中，飞行器的目标飞行速度。如果额外定义了某航点的该元素，则局部定义会覆盖全局定义。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:waylineCoordinateSysParam</td>
 * <td>坐标系参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:payloadParam</td>
 * <td>负载设置</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h3><code>&lt;wpml:payloadParam&gt;</code></h3>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:payloadPositionIndex</td>
 * <td>负载挂载位置</td>
 * <td>整型</td>
 * <td>-</td>
 * <td>0：飞行器1号挂载位置。M300 RTK，M350 RTK机型，对应机身左前方。其它机型，对应主云台。<br/>1：飞行器2号挂载位置。M300 RTK，M350 RTK机型，对应机身右前方。<br/>2：飞行器3号挂载位置。M300 RTK，M350 RTK机型，对应机身上方。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:focusMode</td>
 * <td>负载对焦模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>firstPoint：首个航点自动对焦<br/>custom：标定对焦值对焦</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:meteringMode</td>
 * <td>负载测光模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>average：全局测光<br/>spot：点测光</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:dewarpingEnable</td>
 * <td>是否开启畸变矫正</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:returnMode</td>
 * <td>激光雷达回波模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>singleReturnStrongest：单回波<br/>dualReturn：双回波<br/>tripleReturn：三回波</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:samplingRate</td>
 * <td>负载采样率</td>
 * <td>整型</td>
 * <td>Hz</td>
 * <td>60000,<br/>80000,<br/>120000,<br/>160000,<br/>180000,<br/>240000</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:scanningMode</td>
 * <td>负载扫描模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>repetitive：重复扫描<br/>nonRepetitive：非重复扫描</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:modelColoringEnable</td>
 * <td>真彩上色</td>
 * <td>布尔型</td>
 * <td></td>
 * <td>0: 不上色<br/>1: 真彩上色</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:imageFormat</td>
 * <td>图片格式列表</td>
 * <td>枚举-string（列表）</td>
 * <td></td>
 * <td>wide：存储广角镜头照片<br/>zoom：存储变焦镜头照片<br/>ir：存储红外镜头照片<br/>narrow_band: 存储窄带镜头拍摄照片<br/>visable：可见光照片<br/>* 注：存储多个镜头照片，格式如“<code>&lt;wpml:imageFormat&gt;wide,ir&lt;/wpml:imageFormat&gt;</code>”</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>航点飞行模板元素（父元素：<code>&lt;Folder&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:globalWaypointTurnMode</td>
 * <td>全局航点类型（全局航点转弯模式）</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>coordinateTurn：协调转弯，不过点，提前转弯<br/>toPointAndStopWithDiscontinuityCurvature：直线飞行，飞行器到点停<br/>toPointAndStopWithContinuityCurvature：曲线飞行，飞行器到点停<br/>toPointAndPassWithContinuityCurvature：曲线飞行，飞行器过点不停</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalUseStraightLine</td>
 * <td>全局航段轨迹是否尽量贴合直线</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：航段轨迹全程为曲线<br/>1：航段轨迹尽量贴合两点连线</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:globalWaypointTurnMode”被设置为“toPointAndStopWithContinuityCurvature”或“toPointAndPassWithContinuityCurvature”时必需。如果额外定义了某航点的该元素，则局部定义会覆盖全局定义。</td>
 * <td>M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:gimbalPitchMode</td>
 * <td>云台俯仰角控制模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>manual：手动控制。飞行器从一个航点飞向下一个航点的过程中，支持用户手动控制云台的俯仰角度。若无用户控制，则保持飞离航点时的云台俯仰角度。<br/>usePointSetting：依照每个航点设置。飞行器从一个航点飞向下一个航点的过程中，云台俯仰角均匀过渡至下一个航点的俯仰角。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalHeight</td>
 * <td>全局航线高度（相对起飞点高度）<br/></td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalWaypointHeadingParam</td>
 * <td>全局偏航角模式参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>Placemark(Point)</td>
 * <td>航点信息（包括航点经纬度和高度等）</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>建图航拍模板元素（父元素：<code>&lt;Placemark&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:caliFlightEnable</td>
 * <td>是否开启标定飞行<br/>* 注：仅适用于M300 RTK与M350 RTK机型</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启，航线中自动进行惯导标定，保证模型精度。航线收尾会进行三次加减速飞行，航线拐弯处自动外扩进行加减速飞行。航线过长会均匀插入加减速飞行，每次标定后飞行时间不会超过100s。</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:elevationOptimizeEnable</td>
 * <td>是否开启高程优化</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启，飞行器会在航线执行完毕后，飞向测区中心采集一组倾斜照片，优化高程精度。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:smartObliqueEnable</td>
 * <td>是否开启智能摆拍<br/>* 注：M300 RTK 与 M350 RTK 机型仅支持 P1 相机</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启，飞行器在单次建图航拍任务过程中，可通过云台摆动完成正射与倾斜照片拍摄。</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M3E/M3T/M3M，M3D</td>
 * </tr>
 * <tr>
 * <td>wpml:smartObliqueGimbalPitch</td>
 * <td>智能摆拍拍摄俯仰角<br/>* 注：M300 RTK 与 M350 RTK 机型仅支持 P1 相机</td>
 * <td>整型</td>
 * <td>°</td>
 * <td>对应机型云台可转动范围</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M3E/M3T/M3M，M3D</td>
 * </tr>
 * <tr>
 * <td>wpml:shootType</td>
 * <td>拍照模式（定时或定距）</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>time：等时间拍照<br/>distance：等间隔拍照<br/>* 注：建议使用“time”等时间拍照。在template.kml文件中定义“拍照模式”、“重叠率”和“飞行速度”，计算后得出间隔时间或间隔距离距离写入waylines.wpml中。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:direction</td>
 * <td>航线方向</td>
 * <td>整型</td>
 * <td>-</td>
 * <td>[0, 360]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:margin</td>
 * <td>测区外扩距离</td>
 * <td>整型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:overlap</td>
 * <td>重叠率参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:ellipsoidHeight</td>
 * <td>全局航线高度（椭球高）<br/>* 注：如果 wpml:height 选用相对起飞点高度，则 wpml:ellipsoidHeight 和 wpml:height 相同；如果 wpml:height 选用 EGM96 海拔高度或 AGL 相对地面高度，则 wpml:wpml:ellipsoidHeight 由 wpml:height 做相应转换得到。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:height</td>
 * <td>全局航线高度（EGM96海拔高/相对起飞点高度/AGL相对地面高度）<br/>* 注：该元素与 wpml:ellipsoidHeight 配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:facadeWaylineEnable</td>
 * <td>是否开启斜立面<br/>* 注：该元素与 ”LinearRing“ 配合使用，开启后将按照椭球该读取其中的高度值</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>-</td>
 * <td>M3E/M3T/M3M</td>
 * </tr>
 * <tr>
 * <td>Polygon</td>
 * <td>测区多边形<br/>* 注：此处格式如“<code>&lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt; 经度,纬度,高度 经度,纬度,高度 经度,纬度,高度 &lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt;</code>”<br/>* 注：当 wpml:facadeWaylineEnable 为 1 时，测区多边形支持空中面，如“<code>&lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt; 经度,纬度,300 经度,纬度,200 经度,纬度,50 &lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt;</code>”，航线生成方向与端点顺序有关</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:mappingHeadingParam</td>
 * <td>建图航拍飞行器朝向参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:gimbalPitchMode</td>
 * <td>云台俯仰角模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>manual：手动控制云台俯仰角<br/>fixed：固定为用户设置的俯仰角</td>
 * <td>-</td>
 * <td>M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:gimbalPitchAngle</td>
 * <td>云台俯仰角度</td>
 * <td>°</td>
 * <td>-</td>
 * <td>[-90, -30]</td>
 * <td>*注：当wpml:gimbalPitchMode为fixed时，该值为必需元素</td>
 * <td>M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>倾斜摄影模板元素（父元素：<code>&lt;Placemark&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:caliFlightEnable</td>
 * <td>是否开启标定飞行<br/>* 注：仅适用于M300 RTK与M350 RTK机型</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启，航线中自动进行惯导标定，保证模型精度。航线收尾会进行三次加减速飞行，航线拐弯处自动外扩进行加减速飞行。航线过长会均匀插入加减速飞行，每次标定后飞行时间不会超过100s。</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedGimbalPitch</td>
 * <td>云台俯仰角度（倾斜）</td>
 * <td>整型</td>
 * <td>°</td>
 * <td>* 注：不同云台可转动范围不同。倾斜摄影模板会被生成五条航线，其中1条采集正射影像，4条采集倾斜影像。此元素用于设置倾斜影像采集时云台俯仰角度。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedFlightSpeed</td>
 * <td>航线飞行速度（倾斜）</td>
 * <td>浮点型</td>
 * <td>m/s</td>
 * <td>[1,15]<br/>* 注：倾斜摄影模板会被生成五条航线，其中1条采集正射影像，4条采集倾斜影像。此元素用于设置倾斜影像采集时飞行目标速度。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:shootType</td>
 * <td>拍照模式（定时或定距）</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>time：等时间拍照<br/>distance：等间隔拍照* 注：建议使用“time”等时间拍照。在template.kml文件中定义“拍照模式”、“重叠率”和“飞行速度”，计算后得出间隔时间或间隔距离距离写入waylines.wpml中。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:direction</td>
 * <td>航线方向</td>
 * <td>整型</td>
 * <td>°</td>
 * <td>[0, 360]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:margin</td>
 * <td>测区外扩距离</td>
 * <td>整型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:overlap</td>
 * <td>重叠率参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:ellipsoidHeight</td>
 * <td>全局航线高度（椭球高）<br/>* 注：该元素与“wpml:height”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:height</td>
 * <td>全局航线高度（EGM96海拔高/相对起飞点高度/AGL相对地面高度）<br/>* 注：该元素与“wpml:ellipsoidHeight”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>Polygon</td>
 * <td>测区多边形<br/>* 注：此处格式如“<code>&lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt; 经度,纬度,0 经度,维度,0 经度,纬度,0 &lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt;</code>”</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>航带飞行模板元素（父元素：<code>&lt;Placemark&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:caliFlightEnable</td>
 * <td>是否开启标定飞行</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:shootType</td>
 * <td>拍照模式（定时或定距）</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>time：等时间拍照<br/>distance：等间隔拍照* 注：建议使用“time”等时间拍照。在template.kml文件中定义“拍照模式”、“重叠率”和“飞行速度”，计算后得出间隔时间或间隔距离距离写入waylines.wpml中。</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:direction</td>
 * <td>航线方向</td>
 * <td>整型</td>
 * <td>°</td>
 * <td>[0, 360]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:margin</td>
 * <td>测区外扩距离</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:singleLineEnable</td>
 * <td>是否开启单航线飞行</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:cuttingDistance</td>
 * <td>每个子航带航线长度</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:boundaryOptimEnable</td>
 * <td>是否开启边缘优化</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:leftExtend</td>
 * <td>航带左侧外扩距离</td>
 * <td>整型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:rightExtend</td>
 * <td>航带右侧外扩距离</td>
 * <td>整型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:includeCenterEnable</td>
 * <td>是否包含中心线</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不包含<br/>1：包含</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:overlap</td>
 * <td>重叠率参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:ellipsoidHeight</td>
 * <td>全局航线高度（椭球高）<br/>* 注：该元素与“wpml:height”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:height</td>
 * <td>全局航线高度（EGM96海拔高/相对起飞点高度/AGL相对地面高度）<br/>* 注：该元素与“wpml:ellipsoidHeight”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:stripUseTemplateAltitude</td>
 * <td>是否开启变高航带<br/> <em>注：该元素与“LineString”配合使用，开启后将按照椭球高读取其中的高度值。</em></td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启<br/>1：开启</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>LineString</td>
 * <td>航点信息<br/> <em>注：格式为 “<code>&lt;LineString&gt; &lt;coordinates&gt; 经度,纬度,高度 经度,维度,高度 经度,纬度,高度 &lt;/coordinates&gt; &lt;/LineString&gt;</code>”。其中高度值仅在 “wpml:stripUseTemplateAltitude” 开启时读取。</em></td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>航点信息（父元素：<code>&lt;Placemark&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:isRisky</td>
 * <td>是否危险点</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：正常点，1：危险点</td>
 * <td>-</td>
 * <td>M30/M30T，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>Point</td>
 * <td>航点经纬度&lt;经度,纬度&gt;<br/>* 注：此处格式如“<code>&lt;Point&gt; &lt;coordinates&gt; 经度,纬度 &lt;/coordinates&gt; &lt;/Point&gt;</code>”</td>
 * <td>浮点型</td>
 * <td>°,°</td>
 * <td>[-180,180],[-90,90]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:index</td>
 * <td>航点序号<br/>* 注：在一条航线内该ID唯一。该序号必须从0开始单调连续递增。</td>
 * <td>整型</td>
 * <td>-</td>
 * <td>[0, 65535]</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:useGlobalHeight</td>
 * <td>是否使用全局高度</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0, 1</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:ellipsoidHeight</td>
 * <td>航点高度（WGS84椭球高度）<br/>* 注：该元素与“wpml:height”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:useGlobalHeight”为“0”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:height</td>
 * <td>航点高度（EGM96海拔高度/相对起飞点高度/AGL相对地面高度）<br/>* 注：该元素与“wpml:ellipsoidHeight”配合使用，二者是同一位置不同高程参考平面的表达。</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:useGlobalHeight”为“0”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:useGlobalSpeed</td>
 * <td>是否使用全局飞行速度<br/>* 注：此处的全局飞行速度即“wpml:autoFlightSpeed”</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不使用全局设置<br/>1：使用全局设置</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:waypointSpeed</td>
 * <td>航点飞行速度</td>
 * <td>浮点型</td>
 * <td>m/s</td>
 * <td>[1,15]<br/></td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:useGlobalSpeed”为“0”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:useGlobalHeadingParam</td>
 * <td>是否使用全局偏航角模式参数</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不使用全局设置<br/>1：使用全局设置</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:waypointHeadingParam</td>
 * <td>偏航角模式参数</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:useGlobalHeadingParam”为“0”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:useGlobalTurnParam</td>
 * <td>是否使用全局航点类型（全局航点转弯模式）</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不使用全局设置<br/>1：使用全局设置</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:waypointTurnParam</td>
 * <td>航点类型（航点转弯模式）</td>
 * <td>-</td>
 * <td>-</td>
 * <td>-</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:useGlobalTurnParam”为“0”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:useStraightLine</td>
 * <td>该航段是否贴合直线</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：航段轨迹全程为曲线<br/>1：航段轨迹尽量贴合两点连线</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:waypointTurnParam”内&quot;waypointTurnMode&quot;被设置为“toPointAndStopWithContinuityCurvature”或“toPointAndPassWithContinuityCurvature”时必需。如果此元素被设置，则局部定义会覆盖全局定义。</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:gimbalPitchAngle</td>
 * <td>航点云台俯仰角</td>
 * <td>浮点型</td>
 * <td>°</td>
 * <td>对应机型云台可转动范围</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:gimbalPitchMode”为“usePointSetting”时必需。</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>坐标系参数信息（父元素：<code>&lt;wpml:waylineCoordinateSysParam&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:coordinateMode</td>
 * <td>经纬度坐标系</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>WGS84：当前固定使用<br/>WGS84坐标系</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:heightMode</td>
 * <td>航点高程参考平面</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>EGM96：使用海拔高编辑<br/>relativeToStartPoint：使用相对点的高度进行编辑<br/>aboveGroundLevel：使用地形数据，AGL下编辑(仅支持司空2平台)<br/>realTimeFollowSurface: 使用实时仿地模式（仅用于建图航拍模版），仅支持M3E/M3T/M3M机型</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:positioningType</td>
 * <td>经纬度与高度数据源</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>GPS：位置数据采集来源为GPS/BDS/GLONASS/GALILEO等<br/>RTKBaseStation：采集位置数据时，使用RTK基站进行差分定位<br/>QianXun：采集位置数据时，使用千寻网络RTK进行差分定位<br/>Custom：采集位置数据时，使用自定义网络RTK进行差分定位</td>
 * <td>无，非必需元素<br/>* 注：该元素仅用于标记位置数据来源，不影响实际航线执行。</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:globalShootHeight</td>
 * <td>飞行器离被摄面高度（相对地面高）<br/>* 注：仅适用于模板类型mapping2d，mapping3d，mappingStrip</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>用于计算拍照间距和GSD</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:surfaceFollowModeEnable</td>
 * <td>是否开启仿地飞行<br/>* 注：仅适用于模板类型mapping2d，mapping3d，mappingStrip</td>
 * <td>布尔型</td>
 * <td>-</td>
 * <td>0：不开启1：开启</td>
 * <td>必需元素</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:surfaceRelativeHeight</td>
 * <td>仿地飞行离地高度（相对地面高）<br/>* 注：仅适用于模板类型mapping2d，mapping3d，mappingStrip</td>
 * <td>浮点型</td>
 * <td>m</td>
 * <td>-</td>
 * <td>必需元素<br/>* 注：当且仅当“wpml:surfaceFollowModeEnable”为“1”时必需</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>重叠率信息（父元素<code>&lt;wpml:overlap&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:orthoLidarOverlapH</td>
 * <td>激光航向重叠率（正射）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:orthoLidarOverlapW</td>
 * <td>激光旁向重叠率（正射）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:orthoCameraOverlapH</td>
 * <td>可见光航向重叠率（正射）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:orthoCameraOverlapW</td>
 * <td>可见光旁向重叠率（正射）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedLidarOverlapH</td>
 * <td>激光航向重叠率（倾斜）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedLidarOverlapW</td>
 * <td>激光旁向重叠率（倾斜）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedCameraOverlapH</td>
 * <td>可见光航向重叠率（倾斜）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:inclinedCameraOverlapW</td>
 * <td>可见光旁向重叠率（倾斜）</td>
 * <td>整型</td>
 * <td>百分比</td>
 * <td>[0, 100]</td>
 * <td>-</td>
 * <td>M300 RTK，M350 RTK，M30/M30T，M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 * <h4>建图航拍飞行器朝向参数（父元素<code>&lt;wpml:mappingHeadingParam&gt;</code>）</h4>
 * <table>
 * <thead>
 * <tr>
 * <th>元素</th>
 * <th>名称</th>
 * <th>类型</th>
 * <th>单位</th>
 * <th>取值与释义</th>
 * <th>是否必需（默认值）</th>
 * <th>支持机型</th>
 * </tr>
 * </thead>
 * <tbody><tr>
 * <td>wpml:mappingHeadingMode</td>
 * <td>飞行器偏航角模式</td>
 * <td>枚举-string</td>
 * <td>-</td>
 * <td>fixed:固定为用户设置的偏航角<br/>followWayline:偏航角跟随航线</td>
 * <td>-</td>
 * <td>M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * <tr>
 * <td>wpml:mappingHeadingAngle</td>
 * <td>飞行器偏航角</td>
 * <td>整型</td>
 * <td>°</td>
 * <td>[0, 360]</td>
 * <td>*注：当wpml:mappingHeadingMode为fixed时，该值为必需元素</td>
 * <td>M3E/M3T/M3M，M3D/M3TD</td>
 * </tr>
 * </tbody></table>
 */
@Data
@XStreamAlias("kml")
public class Template implements KMLConverter<Template>, JSONConverter<Template> {

	@XStreamAsAttribute
	@XStreamAlias("xmlns")
	private String xmlns = "http://www.opengis.net/kml/2.2";

	@XStreamAsAttribute
	@XStreamAlias("xmlns:wpml")
	private String xmlnsWpml = "http://www.dji.com/wpmz/1.0.6";

	@XStreamAlias("Document")
	private Document document;

	@Data
	@XStreamAlias("Document")
	public static class Document {
		@XStreamAlias("wpml:author")
		private String author;

		@XStreamAlias("wpml:createTime")
		private Long createTime;

		@XStreamAlias("wpml:updateTime")
		private Long updateTime;

		@XStreamAlias("wpml:missionConfig")
		private MissionConfig missionConfig;

		@XStreamAlias("Folder")
		private Folder folder;
	}

	@Data
	@XStreamAlias("wpml:missionConfig")
	public static class MissionConfig {
		@XStreamAlias("wpml:flyToWaylineMode")
		private String flyToWaylineMode;

		@XStreamAlias("wpml:finishAction")
		private String finishAction;

		@XStreamAlias("wpml:exitOnRCLost")
		private String exitOnRCLost;

		@XStreamAlias("wpml:executeRCLostAction")
		private String executeRCLostAction;

		@XStreamAlias("wpml:takeOffSecurityHeight")
		private Integer takeOffSecurityHeight;

		@XStreamAlias("wpml:takeOffRefPoint")
		private String takeOffRefPoint; // format: "latitude,longitude,height"

		@XStreamAlias("wpml:takeOffRefPointAGLHeight")
		private Integer takeOffRefPointAGLHeight;

		@XStreamAlias("wpml:globalTransitionalSpeed")
		private Integer globalTransitionalSpeed;

		@XStreamAlias("wpml:globalRTHHeight")
		private Double globalRTHHeight;

		@XStreamAlias("wpml:droneInfo")
		private Common.DroneInfo droneInfo;

		@XStreamAlias("wpml:payloadInfo")
		private Common.PayloadInfo payloadInfo;

		@XStreamAlias("wpml:autoRerouteInfo")
		private Common.AutoRerouteInfo autoRerouteInfo;
	}

	@Data
	@XStreamAlias("Folder")
	public static class Folder {
		@XStreamAlias("wpml:templateType")
		private String templateType;

		@XStreamAlias("wpml:useGlobalTransitionalSpeed")
		private Integer useGlobalTransitionalSpeed;

		@XStreamAlias("wpml:templateId")
		private Integer templateId;

		@XStreamAlias("wpml:waylineCoordinateSysParam")
		private WaylineCoordinateSysParam waylineCoordinateSysParam;

		@XStreamAlias("wpml:autoFlightSpeed")
		private Integer autoFlightSpeed;

		@XStreamAlias("wpml:gimbalPitchMode")
		private String gimbalPitchMode;

		@XStreamAlias("wpml:globalWaypointHeadingParam")
		private Common.GlobalWaypointHeadingParam globalWaypointHeadingParam;

		@XStreamAlias("wpml:globalWaypointTurnMode")
		private String globalWaypointTurnMode;

		@XStreamAlias("wpml:globalUseStraightLine")
		private Integer globalUseStraightLine;

		@XStreamAlias("wpml:globalHeight")
		private Double globalHeight;

		@XStreamAlias("wpml:payloadParam")
		private Common.PayloadParam payloadParam;

		@XStreamImplicit(itemFieldName = "Placemark")
		private List<Placemark> placemark;
	}

	@Data
	@XStreamAlias("wpml:waylineCoordinateSysParam")
	public static class WaylineCoordinateSysParam {
		@XStreamAlias("wpml:coordinateMode")
		private String coordinateMode;

		@XStreamAlias("wpml:heightMode")
		private String heightMode;

		@XStreamAlias("wpml:globalShootHeight")
		private Integer globalShootHeight;

		@XStreamAlias("wpml:positioningType")
		private String positioningType;

		@XStreamAlias("wpml:surfaceFollowModeEnable")
		private Integer surfaceFollowModeEnable;

		@XStreamAlias("wpml:surfaceRelativeHeight")
		private Integer surfaceRelativeHeight;
	}

	@Data
	@XStreamAlias("wpml:overlap")
	public static class Overlap {
		@XStreamAlias("wpml:orthoLidarOverlapH")
		private Integer orthoLidarOverlapH;

		@XStreamAlias("wpml:orthoLidarOverlapW")
		private Integer orthoLidarOverlapW;

		@XStreamAlias("wpml:orthoCameraOverlapH")
		private Integer orthoCameraOverlapH;

		@XStreamAlias("wpml:orthoCameraOverlapW")
		private Integer orthoCameraOverlapW;

		@XStreamAlias("wpml:inclinedLidarOverlapH")
		private Integer inclinedLidarOverlapH;

		@XStreamAlias("wpml:inclinedLidarOverlapW")
		private Integer inclinedLidarOverlapW;

		@XStreamAlias("wpml:inclinedCameraOverlapH")
		private Integer inclinedCameraOverlapH;

		@XStreamAlias("wpml:inclinedCameraOverlapW")
		private Integer inclinedCameraOverlapW;
	}

	@Data
	@XStreamAlias("wpml:mappingHeadingParam")
	public static class MappingHeadingParam {
		@XStreamAlias("wpml:mappingHeadingMode")
		private String mappingHeadingMode;

		@XStreamAlias("wpml:mappingHeadingAngle")
		private Integer mappingHeadingAngle;
	}

	@Data
	@XStreamAlias("Placemark")
	public static class Placemark {
		@XStreamAlias("Point")
		private Point point;

		@XStreamAlias("wpml:index")
		private Integer index;

		@XStreamAlias("wpml:ellipsoidHeight")
		private Double ellipsoidHeight;

		@XStreamAlias("wpml:height")
		private Double height;

		@XStreamAlias("wpml:useGlobalHeight")
		private Integer useGlobalHeight;

		@XStreamAlias("wpml:useGlobalSpeed")
		private Integer useGlobalSpeed;

		@XStreamAlias("wpml:useGlobalHeadingParam")
		private Integer useGlobalHeadingParam;

		@XStreamAlias("wpml:useGlobalTurnParam")
		private Integer useGlobalTurnParam;

		@XStreamAlias("wpml:gimbalPitchAngle")
		private Double gimbalPitchAngle;

		@XStreamAlias("wpml:actionGroup")
		private Common.ActionGroup actionGroup;

		// TODO: Add other fields if necessary.
	}

	@Data
	@XStreamAlias("Point")
	public static class Point {
		@XStreamAlias("coordinates")
		private String coordinates; // format: "longitude,latitude"
	}
}
